import dayjs from 'dayjs';

import { isEmail, isPhone } from './validate';
import { i18nTranslate } from '../i18n';

/**
 * 手机号码和邮箱字符串脱敏
 * @param str
 * @returns
 */
export function accountMasking(str: string): String {
  if (isPhone(str)) {
    // 手机号码：脱敏规则前3后4
    return str.substring(0, 3) + ' **** ' + str.substring(7);
  } else if (isEmail(str)) {
    // 脱敏规则：邮箱前3位和邮箱域名后缀
    return str.substring(0, 3) + '****' + str.substring(str.indexOf('@'));
  } else {
    // 不是手机邮箱格式的，直接返回空
    return '';
  }
}

/**
 * 对数字进行小数位精度处理，并返回一个字符串，避免出现科学计数格式的数字
 * @param decimal 数字
 * @param digits 精确度
 * @returns
 */
export const formatDecimal = (decimal: number | string, digits = 2) => {
  // 如果传进来的不能转为数字，则返回0，同时应该上报异常
  if (decimal === undefined || Number.isNaN(decimal)) {
    return '0';
  }
  // 得到含有小数点后十位的数字字符串
  const _decimalStr = Number(decimal).toFixed(10);
  const decimalPointIndex = _decimalStr.indexOf('.');
  // 截取的方式对数字向下取整
  const _decimalStrWithDigits = _decimalStr.substring(0, decimalPointIndex + digits + 1);
  // 将小数点后面多余的0都替换掉
  return _decimalStrWithDigits.replace(/\.?0+$/, '');
};

/**
 * 格式化法币金额，添加千分符，固定小数点精确度位 4 位
 * @param amount
 * @param isHide
 * @returns
 */
export const formatCurrencyAmount = (amount: number | string, isHide = false) => {
  if (isHide) {
    return '********';
  }

  // 如果传进来的不能转为数字，则返回0，同时应该上报异常
  if (amount === undefined || Number.isNaN(amount)) {
    return '0';
  }

  // 精确度，法币统一精确到 4 位小数
  const digits = 4;
  const _number = formatDecimal(amount, digits);
  // 添加千分符
  return _number.replace(/^-?\d+/g, (m) => m.replace(/(?=(?!\b)(\d{3})+$)/g, ','));
};

/**
 * 格式化虚拟币资产数量，添加千分符，固定小数点精确度
 * @param number 数量
 * @param assetsCode 虚拟资产币种
 * @param isHide 是否隐藏为 ****
 * @returns
 */
export const formatAssetsNumber = (
  number: number | string,
  assetsCode: string,
  isHide = false,
  digit?: number,
) => {
  if (isHide) {
    return '********';
  }

  // 如果传进来的不能转为数字，则返回0，同时应该上报异常
  if (number === undefined || Number.isNaN(number)) {
    return '0';
  }

  // 精确度，wt 和 usdt 仅精确到2位数
  const digits = digit ? digit : ['WT', 'USD'].includes(assetsCode) ? 2 : 8;
  const _number = formatDecimal(number, digits);
  // 添加千分符
  return _number.replace(/^-?\d+/g, (m) => m.replace(/(?=(?!\b)(\d{3})+$)/g, ','));
};

export const formatMinuteToString = (statusMinute: number | string) => {
  if (Number(statusMinute) < 60) {
    return statusMinute + i18nTranslate('minutes');
  } else if (Number(statusMinute) < 24 * 60) {
    const hours = Number(statusMinute) / 60;
    return hours + i18nTranslate('hours');
  } else {
    const days = Number(statusMinute) / 60 / 24;
    return days + i18nTranslate('days');
  }
};

/**
 * 将时间转换为月+天+时分秒
 */
export const formatMDHms = (
  date?: string | number | dayjs.Dayjs | Date | null | undefined,
  format = 'MM-DD HH:mm:ss',
) => dayjs(date).format(format);

/**
 * 将时间转换为年+月+天+时分秒
 */
export const formatYMDHms = (date?: string | number | dayjs.Dayjs | Date | null | undefined) =>
  dayjs(date).format('YYYY-MM-DD HH:mm:ss');

/**
 * 将时间转换为年+月+天+时分秒
 */
export const formatMDY = (date?: string | number | dayjs.Dayjs | Date | null | undefined) =>
  dayjs(date).format('YYYY-MM-DD');

/**
 * 仅允许输入数字
 * @param str
 * @returns
 */
export const onlyNumberAllowed = (str: string) => str.replace(/[^\d]+/g, '');

/**
 * 过滤空格
 * @param str
 * @returns
 */
export const replaceSpace = (str: string) => str.replace(/\s/g, '');

/**
 * 过滤中文
 * @param str
 * @returns
 */
export const replaceChinese = (str: string) => str.replace(/[\u4e00-\u9fa5]/g, '');

/**
 * 过滤表情
 * @param str
 * @returns
 */
export const replaceEmoji = (str: string) => {
  const patt = /[\ud800-\udbff][\udc00-\udfff]/g; // 检测utf16字符正则
  str = str.replace(patt, (char) => {
    let H;
    let L;
    let code;

    if (char.length === 2) {
      H = char.charCodeAt(0); // 取出高位
      L = char.charCodeAt(1); // 取出低位
      code = (H - 0xd800) * 0x400 + 0x10000 + L - 0xdc00; // 转换算法

      console.log(code);
      return '';
    }

    return char;
  });

  return str;
};

// 判断是不是空 是--true
export function isNull(str: string) {
  if (str === '' || str === null) {
    return true;
  } else {
    return false;
  }
}
// 密码 校验
export function pwdReg(psd: string) {
  const value = psd.replace(/\s*/g, '');
  const myreg = /^[a-zA-Z0-9!@#$%^&*.]{6,12}$/; // 手机号码验证
  return myreg.test(value);
}
